package com.bdqn.spark.chapter05

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD

object Spark02_RDD_File_Par {
  def main(args: Array[String]): Unit = {
    val conf: SparkConf = new SparkConf()
      .setMaster("local[*]")
      .setAppName("RDD-File")
    val sc: SparkContext = new SparkContext(conf)

    val fileSourceRDD: RDD[String] =
      sc.textFile("input/1.txt",2)

    // 第一个问题：spark在读取文件的时候，如何设置并行度
    // minPartitions: Int = defaultMinPartitions // 最小分区
    // defaultParallelism:本机CPU的核数：12
    // defaultMinPartitions:math.min(defaultParallelism, 2)

    // 在程序中，指定了最小分区数（不是实际分区）
    // 第二个问题：如何确定分区实际的个数
    // long totalSize = 0;  // 要读取的文件的总大小
    // totalSize=7字节

    //  long goalSize = totalSize / (numSplits == 0 ? 1 : numSplits);
    // long goalSize = totalSize /  numSplits;
    // goalSize = 7 / 2  = 3 字节 （每个分区中，存 3 个字节）

    // 确定分区的个数：
    // 总共有7个字节，每个分区存3个字节
    // 第一个分区：3个，存三个字节  剩下4个字节
    // 第二个分区：3个，存三个字节  剩下1个字节
    // 第三个分区：1个，存一个字节

    // 总结一下：spark读取文件的方式，采用MapReduce的方式读取数据
    // Spark 对数据进行切片的方式，采用 FileInputFormat 中的 getSplit() 方法

    // 第三个问题：数据分区的分配
    // 读取的第一个规则：Hadoop读取文件的方式按照行来读取，
    // 跟字节数没有关系，防止把单词切开，导致结果不准确
    // hello

    // 读取的第二个规则：Spark 读取数据的时候，是按照偏移量来读的，
    // 偏移量不重复读取

    // spark分区的偏移量是如何算出来的
    // 分区3个，每个分区的偏移量如何算出来


    // 1@@
    // 012

    // 2@@
    // 345

    // 3
    // 6

    // 0  [0,3]   => 1@@2@@
    // 1  [3,6]   => 3
    // 2  [6,7]   =>
    // 为什么便宜量的范围，都是闭合的，这个暂时不清楚



    fileSourceRDD.saveAsTextFile("output")


    sc.stop()
  }
}
